package monitormercado.negocio.analise.estrategia.stop;

import java.util.Date;
import java.util.Iterator;
import java.util.List;

import monitormercado.framework.Analise;
import monitormercado.framework.Conclusao;
import monitormercado.framework.Sinal;
import monitormercado.negocio.Tick.ControladorTick;
import monitormercado.negocio.Tick.Tick;
import monitormercado.util.Util;

public class SituacaoComprada implements ISituacaoAnalise {
	private static final String NOME_INDICADOR = "Stop Loss";
	private Sinal ultimoSinal;
	

	private double percentual;
	
	public SituacaoComprada(double percentual) {
		super();
		this.percentual = percentual;
	}

	private ISituacaoAnalise situacaoVenda;
	

	public void incluirSinal(Sinal sinal, List<Tick> ticks, Analise analise) {
		Date dataInicial = Util.somaDiasUteis(ultimoSinal.getData(), 1);
		Date dataFinal = Util.diminuiDiasUteis(sinal.getData(), 1);
		Double stop = getStop(sinal);

		Tick tick = isTickAbaixoStop(dataInicial, dataFinal, stop, ticks);
		if (tick != null) {
			disparaStop(analise, tick);
		}
		analise.incluirSinal(sinal);
		setProximaSituacao(sinal,analise);

	}

	private void disparaStop(Analise analise, Tick tick) {
		analise.incluirSinal(novoSinalVenda(tick));
	}

	public void setProximaSituacao(Sinal sinal,Analise analise) {
		if (sinal.getConclusao() == Conclusao.VENDA) {
			analise.setSituacaoAnalise(getSituacaoVendida());
		} else {
			setUltimoSinal(sinal);
		}
		
	}

	private Tick isTickAbaixoStop(Date dataInicial, Date dataFinal, Double valorMinimo, List<Tick> ticks) {
		Tick menorTick = null;
		for (Iterator<Tick> iterator = getIteratorFiltroTicks(dataInicial, dataFinal, ticks); 
				iterator.hasNext()&& menorTick == null;) {
			
			Tick tick = iterator.next();
			if (isAbaixoMinimo(tick, valorMinimo)) {
				menorTick = tick;
			}
		}
		return menorTick;
	}

	private boolean isAbaixoMinimo(Tick tick, Double valorMinimo) {
		return Double.valueOf(tick.getFechamento()).compareTo(valorMinimo) < 0;
	}

	private Sinal novoSinalVenda(Tick tick) {
		return new Sinal(
				NOME_INDICADOR + " " + tick.getSigla() + " " + Util.formatarData(tick.getData(), "dd/MM/yyyy"),
				Conclusao.VENDA, tick,true);

	}

	private Iterator getIteratorFiltroTicks(Date dataInicial, Date dataFinal, List<Tick> ticks) {
		return ControladorTick.getIteratorFiltroIntervalo(dataInicial, dataFinal, ticks.iterator());
	}

	private Double getStop(Sinal sinal) {
		double fechamento = ultimoSinal.getPreco();
		return Double.valueOf(fechamento - (fechamento * percentual / 100.0));
	}
	
	public Sinal getUltimoSinal() {
		return ultimoSinal;
	}

	public void setUltimoSinal(Sinal ultimoSinal) {
		this.ultimoSinal = ultimoSinal;
	}
	
	public ISituacaoAnalise getSituacaoVendida() {
		if (situacaoVenda == null) {
			situacaoVenda = novaSituacaoVendida();
			
		}

		return situacaoVenda;
	}

	public ISituacaoAnalise novaSituacaoVendida() {
		return new ISituacaoAnalise() {
		
			public void incluirSinal(Sinal sinal, List<Tick> ticks, Analise analise) {
				analise.incluirSinal(sinal);
				setProximaSituacao(sinal, analise);
			}
			
			public void setProximaSituacao(Sinal sinal, Analise analise) {
				if (sinal.getConclusao() ==  Conclusao.COMPRA) {
					setUltimoSinal(sinal);
					analise.setSituacaoAnalise(SituacaoComprada.this);
				}
		
			}
		};
	}
	

}
